home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / pdclk145.zip / TBLBUILD.ASM < prev   
Assembly Source File  |  1992-08-13  |  21KB  |  1,192 lines

  1. ;========================================================================
  2.  
  3. ; Copyright (C) 1991 by Jan.Engvald@ldc.lu.se, see file COPYING.
  4.  
  5. InAdrArpa    db    7,"in-addr",4,"arpa",0
  6. Qtype        dw    0c00h
  7. Qclass        dw    0100h
  8. InAdrArpaLen    equ    $-InAdrArpa
  9.  
  10. k16        dw    16
  11. TblSize        dw    16
  12. TblSizeLast    dw    16*16
  13. TblActive    dw    0
  14. TblActLast    dw    0
  15. TblWrNext    dw    0
  16. TblIpProbe    dw    130+256*235, 56+256*0
  17. TblProbeNext    dw    0
  18. TblProbIntvl    dw    9
  19.  
  20. TmpTbl        dw    0, 0, 0, 0, 0, 0, 0
  21.  
  22. SegmData    equ    $
  23. SegIpHwTbl    dw    0
  24. SegHwIpTbl    dw    0
  25. SegmNamTbl    dw    0
  26. SegmNamTbl2    dw    0
  27. TableSegs    equ    ($-SegmData)/2
  28.  
  29. Handle        dw    -1
  30. if DEBUG
  31. NameHwTbl    db    "hwtbl.tmp", 0
  32. NameIpTbl    db    "iptbl.tmp", 0
  33. else
  34. NameHwTbl    db    "hwtbl.txt", 0
  35. NameIpTbl    db    "iptbl.txt", 0
  36. endif ; DEBUG
  37.  
  38. MsgTblSize    db    "Wrote 0    table entries, "
  39. MsgTblAct    db    "0    active this run.", CR, LF, '$'
  40.  
  41.  
  42. ;************************************************************************
  43. ;*        FindIn16Table
  44. ;*
  45. ;*    Input:         DS:SI = address of search string key (saved)
  46. ;*            AX = string length (saved)
  47. ;*            ES = table segment (saved)
  48. ;*            BX = table size in bytes
  49. ;*    Output:         ES:BX = table slot address of entry less or equal to key
  50. ;*            Zero flag if equal to key
  51. ;*    Destroys:    BX, flags
  52. ;*
  53. ;* Before use, the table must be filled with all ones, except slot 0 which
  54. ;* must be filled with zeros. Slot 0 may never be changed.
  55. ;************************************************************************
  56.  
  57. FindIn16Table    proc    near
  58.         push    cx
  59.         push    dx
  60.         push    di
  61.         push    bp
  62.         mov    bp,si
  63.         mov    cx,bx
  64.         xor    bx,bx
  65.         mov    dx,8000h        ; find proper 2**x size
  66.   FindLenLoop:
  67.         cmp    dx,cx
  68.         jb    FindHalfChk        ; start binary search
  69.         shr    dx,1
  70.         jmp    short FindLenLoop
  71.  
  72.   FindLess:
  73.         sub    bx,dx
  74.   FindGreater:
  75.         shr    dx,1            ; divide step by two
  76.   FindHalfChk:
  77.         cmp    dx,16            ; step < slot size?
  78.         jb    FindDone
  79.         add    bx,dx            ; position halfway
  80.  
  81.         mov    di,bx
  82.         mov    si,bp
  83.         mov    cx,ax
  84.         repe    cmpsb            ; compare strings
  85.         ja    FindGreater
  86.         jb    FindLess
  87.   FindDone:
  88.         mov    si,bp
  89.         pop    bp
  90.         pop    di
  91.         pop    dx
  92.         pop    cx
  93.         ret
  94. FindIn16Table    endp
  95.  
  96.  
  97.  
  98. ;************************************************************************
  99. ;*        GetHexNums
  100. ;************************************************************************
  101.  
  102. GetHexNums    proc    near
  103.   GetHexNum:
  104.         xor    dx,dx
  105.   GetHexDig:
  106.         lodsb
  107.         cmp    al,'0'
  108.         jb    GetHexEnd
  109.         cmp    al,'9'
  110.         ja    GetHexTst
  111.         sub    al,'0'
  112.         jmp    short GetHexConv
  113.   GetHexTst:
  114.         cmp    al,'a'
  115.         jb    GetHexEnd
  116.         cmp    al,'f'
  117.         ja    GetHexEnd
  118.         sub    al,'a'-10
  119.   GetHexConv:
  120.         cbw
  121.         add    ax,dx
  122.         mov    cx,ax
  123.         mul    k16
  124.         mov    dx,ax
  125.         jmp    short GetHexDig
  126.   GetHexEnd:
  127.         cmp    al,'-'
  128.         mov    ax,cx
  129.         stosb
  130.         je    GetHexNum
  131.         ret
  132. GetHexNums    endp
  133.  
  134.  
  135.  
  136. ;************************************************************************
  137. ;*        Ins16ByteSlot
  138. ;************************************************************************
  139.  
  140. Ins16ByteSlot    proc    near
  141.         mov    cx,TblSize
  142.         push    es
  143.         pop    ds
  144.         sub    cx,bx
  145.         mov    si,bx
  146.         sub    si,2
  147.         add    si,cx
  148.         mov    di,si
  149.         add    di,16
  150.         std
  151.         shr    cx,1
  152.         rep    movsw
  153.         cld
  154.         push    cs
  155.         pop    ds
  156.         ret
  157. Ins16ByteSlot    endp
  158.  
  159.  
  160.  
  161. ;************************************************************************
  162. ;*        FindHostInTbls
  163. ;************************************************************************
  164.  
  165. FindHostInTbls    proc    near
  166.         push    dx
  167.         push    ax
  168.  
  169.         mov    es,SegHwIpTbl
  170.         mov    bx,TblSize
  171.         mov    ax,10
  172.         mov    si,bp
  173.         call    FindIn16Table
  174.         jz    InitHwMatch
  175.  
  176.         add    bx,16
  177.         call    Ins16byteSlot
  178.         mov    si,bp
  179.         mov    cx,10/2
  180.         mov    di,bx
  181.         rep    movsw
  182.  
  183.         mov    ax,TblSize
  184.         stosw
  185.   InitHwMatch:
  186.         mov    es,SegIpHwTbl
  187.         mov    bx,TblSize
  188.         mov    ax,10
  189.         mov    si,bp
  190.         sub    si,4
  191.         call    FindIn16Table
  192.         jz    InitIpMatch
  193.  
  194.         add    bx,16
  195.         call    Ins16byteSlot
  196.         mov    si,bp
  197.         sub    si,4
  198.         mov    cx,10/2
  199.         mov    di,bx
  200.         rep    movsw
  201.  
  202.         mov    ax,TblSize
  203.         stosw
  204.                 mov     ax,'  '
  205.                 stosw
  206.   InitIpMatch:
  207.         pop    ax
  208.         pop    dx
  209.         ret
  210. FindHostInTbls    endp
  211.  
  212.  
  213.  
  214. ;************************************************************************
  215. ;*        TableInit
  216. ;************************************************************************
  217.  
  218. TableInit    proc    near
  219.         test    Argflags,MAKE_TABLE
  220.         jnz    TableInit2
  221.         ret
  222.   TableInit2:
  223.         mov    bx,(TableSegs-1)*2
  224.         mov    dx,cs
  225.         add    dx,1000h
  226.                 mov     ax,'  '                 ; NamTbl2 must be blanked
  227.   TableFF:
  228.         mov    word ptr SegmData[bx],dx
  229.         mov    es,dx
  230.         add    dx,1000h
  231.                 cmp     dx,PspTopMem            ; end of free memory?
  232.         jbe    TableFits
  233.  
  234.         mov    al,'M'-'0'
  235.         call    terminate
  236.   TableFits:
  237.                 mov     cx,08000h               ; prefill all 64 kb
  238.         xor    di,di
  239.         rep    stosw
  240.  
  241.         sub    bx,2
  242.                 mov     ax,0ffffh               ; IpHwTbl prefill
  243.         jns    TableFF
  244.  
  245.                 xor     ax,ax                   ; zerofill first slot
  246.         mov    es,SegIpHwTbl
  247.         mov    cx,16/2
  248.         xor    di,di
  249.         rep    stosw
  250.  
  251.         mov    es,SegHwIpTbl
  252.         mov    cx,16/2
  253.         xor    di,di
  254.         rep    stosw
  255.  
  256.         push    cs
  257.         pop    es
  258.  
  259.         mov    dx,offset NameHwTbl
  260.         mov    ax,3d02h
  261.         int    21h
  262.         jc    TabInitHw
  263.  
  264.         mov    bx,ax
  265.         mov    ah,3eh
  266.         int    21h
  267.         jmp    TabTstIp
  268.   TabInitHw:
  269.         mov    dx,offset NameHwTbl
  270.         xor    cx,cx
  271.         mov    ah,3ch
  272.         int    21h
  273.         jc    TabOpenErr
  274.   TabTstIP:
  275.         mov    dx,offset NameIpTbl
  276.         mov    ax,3d02h
  277.         int    21h
  278.         mov    Handle,ax
  279.         jnc    TabRdNext
  280.  
  281.         mov    dx,offset NameIpTbl
  282.         xor    cx,cx
  283.         mov    ah,3ch
  284.         int    21h
  285.         jc    TabOpenErr
  286.         jmp    TabRdClOK
  287.   TabOpenErr:
  288.         mov    al,'O'-'0'
  289.         call    terminate
  290.  
  291.   TabRdNext:
  292.         push    cs
  293.         pop    es
  294.         mov    bx,Handle
  295.         mov    cx,72
  296.         mov    dx,offset FileBuf
  297.         mov    ah,3fh
  298.         int    21h
  299.         jc    TabRdErr
  300.  
  301.         or    ax,ax
  302.         jz    TabRdEof
  303.  
  304.         mov    si,offset FileBuf
  305.         cmp    byte ptr [si],'Z'-040h
  306.         je    TabRdEof
  307.         mov    di,offset TmpTbl
  308.         mov    bp,di
  309.         call    GetIpNr
  310.         jnz    TabRdErr
  311.  
  312.         mov    si,offset FileBuf+53
  313.         call    GetHexNums
  314.         cmp    byte ptr [si],LF
  315.         jne    TabRdErr
  316.  
  317.         mov    si,bp
  318.         movsw
  319.         movsw
  320.  
  321.         add    bp,4
  322.         call    FindHostInTbls
  323.         je    InitDup
  324.  
  325.         mov    si,offset FileBuf+16
  326.         mov    di,TblSize
  327.         call    NamePut
  328.         add    TblSize,16
  329.   InitDup:
  330.         push    cs
  331.         pop    es
  332.         mov    byte ptr FileBuf+72,'$'
  333.  
  334.         mov    dx,offset FileBuf
  335.         mov    ah,9
  336.         int    21h
  337.         jmp    TabRdNext
  338.  
  339.   TabRdErr:
  340.         mov    al,'R'-'0'
  341.         call    terminate
  342.  
  343.   TabRdEof:
  344.         mov    bx,Handle
  345.         mov    ah,3eh
  346.         int    21h
  347.         jnc    TabRdClOK
  348.  
  349.         mov    al,'C'-'0'
  350.         call    terminate
  351.   TabRdClOK:
  352. if DEBUG eq 0
  353.         call    ProbeIpInit
  354. endif ; not DEBUG
  355.         call    CurrentTicks
  356.         mov    TblProbeNext,cx
  357.         mov    TblWrNext,cx
  358.         cmp    EchoTarget,0
  359.         jnz    TableInitRet
  360.         or    GenFlags,TBL_READY
  361.   TableInitRet:
  362.         ret
  363. TableInit    endp
  364.  
  365.  
  366.  
  367. ProbeIpInit    proc    near
  368.         mov    dx,MyNet
  369.         mov    ax,Mynet+2
  370.         mov    TblIpProbe,dx
  371.         inc    ah
  372.         mov    TblIpProbe+2,ax
  373.         ret
  374. ProbeIpInit    endp
  375.  
  376.  
  377.  
  378. ;************************************************************************
  379. ;*        TblProbe
  380. ;************************************************************************
  381.  
  382. MsgNeedMask    db    "Need to know network mask", CR, LF, '$'
  383.  
  384. TblProbe     proc    near
  385.         cmp    InSendAndW,0
  386.         jnz    TblProbeRet
  387.  
  388.         test    GenFlags,TBL_READY
  389.         jz    TblProbeRet
  390.  
  391.         call    CurrentTicks
  392.         mov    ax,cx
  393.         sub    ax,TblProbIntvl        ; 2 - 9 probes a second
  394.         sub    ax,TblProbeNext
  395.         js    TblProbeRet
  396.  
  397.         mov    TblProbeNext,cx
  398.  
  399.         mov    ax,cx
  400.         sub    ax,TblWrNext
  401.         js    TblWrLater
  402.  
  403.         add    cx,182*20        ; limit write to once in 200 s
  404.         mov    TblWrNext,cx
  405.  
  406.         mov    ax,TblSize
  407.         mov    dx,TblActive
  408.         cmp    dx,TblActLast
  409.         ja    TblProbeWr
  410.  
  411.         cmp    ax,TblSizeLast
  412.         jbe    TblWrLater
  413.   TblProbeWr:
  414.         mov    TblActLast,dx
  415.         mov    TblSizeLast,ax
  416.         call    TableWr
  417.   TblWrLater:
  418.         test    ArgFlags,TBL_PROBE
  419.         jnz    TblDoProbe
  420.   TblProbeRet:
  421.         ret
  422.  
  423.   TblDoProbe:
  424.         cmp    MyMask,0
  425.         jne    TblProbeChkIntvl
  426.         mov    dx,offset MsgNeedMask
  427.         mov    ah,9
  428.         int    21h
  429.         mov    al,'P'-'0'
  430.         call    Terminate
  431.   TblProbeChkIntvl:
  432.         cmp    TblProbIntvl,2
  433.         jbe    TblProbMin
  434.         dec    TblProbIntvl
  435.   TblProbMin:
  436.  
  437.         mov    dx,TblIpProbe
  438.         mov    ax,TblIpProbe+2
  439.         cmp    ax,ArpTabIp2+2        ; end of subnet numbers?
  440.         jne    TblProbeMore
  441.         cmp    dx,ArpTabIp1+2
  442.         jne    TblProbeMore
  443.         call    ProbeIpInit
  444.   TblProbeMore:
  445.         call    BufAlloc
  446.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  447.         mov    [bx].dTickTimeout,0    ; don't wait
  448.         call    SendArpReq        ; send arp
  449.         call    BufRelease
  450.  
  451.         add    ah,1            ; increment IP #
  452.         adc    al,0
  453.         adc    dh,0
  454.         adc    dl,0
  455.         mov    TblIpProbe,dx
  456.         mov    TblIpProbe+2,ax
  457.         ret
  458. TblProbe    endp
  459.  
  460.  
  461.  
  462. ;************************************************************************
  463. ;*        DoTable
  464. ;************************************************************************
  465.  
  466. DoTable     proc    near
  467.         cmp    TblSize,0fff0h
  468.         jb    $+5
  469.         jmp    TableRetRel
  470.  
  471.         mov    di,[bx].dPtrPhys
  472.         mov    si,[di]
  473.         mov    dx,[di+2]
  474.         mov    ax,[di+4]
  475.         call    ArpFindHw
  476.         mov    [bx].dIdxHwDst,di
  477.  
  478.         mov    di,[bx].dPtrIp
  479.         mov    cx,[di].iArpOp
  480.         add    di,iArpMyHwAd
  481.         mov    bp,di
  482.         add    di,Hlen
  483.         mov    dx,[di]
  484.         mov    ax,[di+2]
  485.         mov    [bp-4],dx
  486.         mov    [bp-4+2],ax
  487.         push    bx
  488.  
  489.         cmp    cx,0200h        ; ignore arp REPLIES from hosts
  490.         jne    DoTabUpdate        ; already known (probably a
  491.         cmp    [bx].dIdxHwDst,ARPMYIDX    ; proxy arp gateway)
  492.         jne    DoTabUpdate
  493.  
  494.         push    ax
  495.         mov    es,SegHwIpTbl
  496.         mov    si,bp
  497.         mov    ax,10
  498.         mov    bx,TblSize
  499.         call    FindIn16Table        ; this Hw+IP addr already known?
  500.         pop    ax
  501.         je    DoTabUpdate
  502.  
  503.         push    ax
  504.         mov    si,bp
  505.         mov    ax,Hlen
  506.         mov    bx,TblSize
  507.         call    FindIn16Table        ; this Hw addr already known?
  508.         pop    ax
  509.         je    TableAnswered
  510.   DoTabUpdate:
  511.         call    FindHostInTbls
  512.         jne    TableAdd
  513.  
  514.         cmp    byte ptr es:[bx+12],' '
  515.         je    TableNew
  516.  
  517.         cmp    byte ptr es:[bx+12],'s'
  518.         jb    TablePending
  519.         dec    TblActive
  520.   TableNew:
  521.         mov    byte ptr es:[bx+12],'p'
  522.         inc    TblActive
  523.         jmp    short TableAsk
  524.   TablePending:
  525.         cmp    byte ptr es:[bx+12],'p'
  526.         jb    TableAnswered
  527.  
  528.         inc    byte ptr es:[bx+12]
  529.   TableAnswered:
  530.         push    cs
  531.         pop    es
  532.         pop    bx
  533.         jmp    TableRetRel
  534.  
  535.   TableAdd:
  536.         mov    byte ptr es:[bx+12],'p'
  537.         inc    TblActive
  538.         push    dx
  539.         push    ax
  540.         push    bx
  541.         mov    si,bp
  542.         add    si,Hlen
  543.         mov    di,TblSize
  544.         mov    es,SegmNamTbl
  545.         call    PutIpNum
  546.         call    BlankUntil16
  547.         add    TblSize,16
  548.         pop    bx
  549.         pop    ax
  550.         pop    dx
  551.   TableAsk:
  552.         mov    TblProbIntvl,9        ; probe twice a second
  553.         mov    es,SegIpHwTbl
  554.         mov    cx,es:[bx+10]
  555.         push    cx            ; save name tbl idx
  556.  
  557.         push    cs
  558.         pop    es
  559.  
  560.         xor    ch,ch
  561.         mov    cl,dh
  562.         xor    dh,dh
  563.         push    dx
  564.         push    cx
  565.         mov    cl,ah
  566.         xor    ah,ah
  567.         push    ax
  568.         push    cx
  569.  
  570.         mov    di,offset FileBuf
  571.         mov    bl,4
  572.         mov    PutMinDigits,1
  573.   TableNumLoop:
  574.         mov    si,di
  575.         inc    di
  576.         pop    ax
  577.         call    PutNum
  578.         mov    [si],dl
  579.         dec    bl
  580.         jnz    TableNumLoop
  581.  
  582.         mov    si,offset InAdrArpa
  583.         mov    cx,InAdrArpaLen
  584.         rep    movsb
  585.  
  586.         mov    dx,1234h        ; tblbuild udp src port
  587.         pop    ax            ; NsId
  588.         mov    si,offset FileBuf    ; Ns question string
  589.         call    NsResolve        ; ask name for this #
  590.         pop    bx
  591.   TableRetRel:
  592.         call    BufRelease
  593.   TableRet:
  594.         ret
  595. DoTable     endp
  596.  
  597.  
  598.  
  599. ;************************************************************************
  600. ;*        BlankUntil16 byte boundry
  601. ;************************************************************************
  602.  
  603. BlankUntil16    proc    near
  604.         mov    al,' '
  605.   BlankMore:
  606.         test    di,0fh
  607.         jz    BlankRet
  608.         stosb
  609.         jmp    short BlankMore
  610.   BlankRet:
  611.         ret
  612. BlankUntil16    endp
  613.  
  614.  
  615.  
  616. ;************************************************************************
  617. ;*        NamePut from DS:SI to TblName[DI]
  618. ;************************************************************************
  619.  
  620. NamePut     proc    near
  621.         mov    es,SegmNamTbl
  622.         mov    cx,16
  623.   NamePutLoop:
  624.         lodsb
  625.         cmp    al,CR
  626.         je    NamePutEnd
  627.         stosb
  628.         loop    NamePutLoop
  629.  
  630.         sub    di,16
  631.         mov    es,SegmNamTbl2
  632.         mov    cx,16
  633.   NamePutLoop2:
  634.         lodsb
  635.         cmp    al,CR
  636.         je    NamePutEnd2
  637.         stosb
  638.         loop    NamePutLoop2
  639.  
  640.   NamePutEnd2:
  641.         call    BlankUntil16
  642.         jmp    short NamePutRet
  643.  
  644.   NamePutEnd:
  645.         call    BlankUntil16
  646.  
  647.         mov    es,SegmNamTbl2
  648.         sub    di,16
  649.         stosb
  650.         jmp    short NamePutEnd2
  651.   NamePutRet:
  652.         push    cs
  653.         pop    es
  654.         ret
  655. NamePut     endp
  656.  
  657.  
  658.  
  659. ;************************************************************************
  660. ;*        ThisIpFirst
  661. ;*    Input:        DI = length prepended IP list
  662. ;*            BX = IP description buffer pointer
  663. ;*    Output:        Moves source IP # to front of IP list
  664. ;************************************************************************
  665.  
  666. ThisIpFirst    proc    near
  667.         mov    si,[bx].dPtrIp
  668.         mov    dx,[si].iIpSrc
  669.         mov    ax,[si].iIpSrc+2
  670.         mov    cl,-1
  671.         mov    ch,[di]            ; list length
  672.   ThisIpNext2:
  673.         inc    di
  674.         inc    di
  675.   ThisIpNext4:
  676.         inc    cl
  677.         cmp    cl,ch            ; more entries in list?
  678.         jae    ThisIpRet
  679.  
  680.         xchg    ax,dx
  681.         scasw                ; first IP word match?
  682.         xchg    ax,dx
  683.         jne    ThisIpNext2
  684.  
  685.         scasw                ; second IP word match?
  686.         jne    ThisIpNext4
  687.  
  688.         dec    di
  689.         lea    si,[di-4]
  690.         std
  691.         xor    ch,ch
  692.         shl    cx,1
  693.         rep    movsw            ; move entries downlist
  694.         cld
  695.         inc    si
  696.         mov    [si],dx            ; insert src IP in front
  697.         mov    [si+2],ax
  698.   ThisIpRet:
  699.         ret
  700. ThisIpFirst    endp
  701.  
  702.  
  703. ;************************************************************************
  704. ;*        DoName
  705. ;************************************************************************
  706.  
  707. DoName        proc    near
  708.         test    GenFlags,TBL_READY
  709.         jnz    NameInited
  710.  
  711.         ret
  712.   NameInited:
  713.         lea    si,[di].uNsQuest
  714.         mov    bp,[di].uNsId
  715.         lea    di,[di].uNsNscount
  716.         mov    dx,si
  717.         inc    dx
  718.  
  719.   BS        equ    'H'-040h
  720.         call    NameDecode
  721.         mov    word ptr [si],'  '
  722.         mov    word ptr [si+2],BS+256*BS
  723.         add    si,4
  724.  
  725.         push    dx
  726.         push    si
  727.         mov    si,dx
  728.         call    GetIpNr
  729.         pop    si
  730.         pop    dx
  731.  
  732.         mov    di,[bx].dPtrUdp
  733.         cmp    [di].uNsAncount,0100h
  734.         je    NameHaveAns
  735.         push    dx
  736.         jmp    short NameNoAnswer
  737.   NameHaveAns:
  738.         mov    di,si
  739.         call    NameDecode
  740.         jnz    NameDcCompr
  741.         mov    dx,di
  742.         inc    dx
  743.   NameDcCompr:
  744.   TAB        equ    'I'-040h
  745.         push    dx
  746.         mov    word ptr [si],TAB+256*'N'
  747.         mov    word ptr [si+2],'ma'
  748.         mov    word ptr [si+4],'0e'
  749.         mov    word ptr [si+6],'00'
  750.         mov    word ptr [si+8],'=0'
  751.         lea    di,[si+5]
  752.         add    si,10
  753.         mov    ax,bp
  754.         mov    cl,4
  755.         shr    ax,cl
  756.         mov    PutMinDigits,4
  757.         call    PutNum
  758.         mov    PutMinDigits,2
  759.  
  760.         mov    di,si
  761.         call    NameDecode
  762.   NameNoAnswer:
  763.         mov    word ptr [si],' '+256*CR
  764.         mov    word ptr [si+2],LF+256*'$'
  765.  
  766.         mov    si,[bx].dPtrUdp
  767.         mov    ax,[si].uNsNScount
  768.         mov    dx,[si].uNsNscount+2
  769.         xchg    ah,al
  770.         xchg    dh,dl
  771.         mov    [si].uNsNScount,dx
  772.         mov    [si].uNsNScount+2,ax
  773.         lea    si,[si].uNsNScount
  774.         push    bx
  775.         mov    bx,TblSize
  776.         mov    es,SegIpHwTbl
  777.         push    ax
  778.         mov    ax,4
  779.         call    FindIn16Table
  780.         pop    ax
  781.         mov    si,bx
  782.         pop    bx
  783.         je    NameFound
  784.   NameNotFound:
  785.         pop    dx
  786.         mov    ah,9
  787.         int    21h
  788.         mov    al,'A'-'0'
  789.         call    Terminate
  790.   NameFound:
  791.         mov    cx,si
  792.   NameFindNxtHi:
  793.         cmp    bp,es:[si+10]
  794.         je    NameFoundThis
  795.         add    si,16
  796.         cmp    dx,es:[si]
  797.         jne    NameFindLower
  798.         cmp    ax,es:[si+2]
  799.         je    NameFindNxtHi
  800.   NameFindLower:
  801.         mov    si,cx
  802.   NameFindNxtLo:
  803.         sub    si,16
  804.         cmp    bp,es:[si+10]
  805.         je    NameFoundThis
  806.         cmp    dx,es:[si]
  807.         jne    NameNotFound
  808.         cmp    ax,es:[si+2]
  809.         jne    NameNotFound
  810.         jmp    short NameFindNxtLo
  811.   NameFoundThis:
  812.         mov    bp,[bx].dPtrUdp
  813.         mov    dx,[bp].uNsAncount
  814.         mov    ax,[bp].uNsOpwd
  815.         and    ah,0fh
  816.         cmp    ah,1            ; format error?
  817.         jne    NameFmtOK
  818.  
  819.         mov    al,'F'-'0'
  820.         call    terminate
  821.   NameFmtOK:
  822.         mov    byte ptr es:[si+12],'t' ; try again next time
  823.  
  824.         cmp    ah,2            ; temporary server problem?
  825.         je    NameSkipUpd
  826.  
  827.         test    al,4            ; authorititive answer?
  828.         jz    NameTryLater
  829.  
  830.         mov    byte ptr es:[si+12],'0' ; we ask no more about this #
  831.   NameTryLater:
  832.         or    ah,ah            ; any other error?
  833.         jnz    NameSkipUpd
  834.  
  835.         cmp    dx,0100h        ; any answer?
  836.         jne    NameSkipUpd
  837.  
  838.         mov    byte ptr es:[si+12],'N' ; we ask no more about this #
  839.         test    al,4            ; authorititive answer?
  840.         jz    NameNotAuth
  841.  
  842.         mov    byte ptr es:[si+12],'A' ; we ask no more about this #
  843.   NameNotAuth:
  844.         mov    si,es:[si+10]
  845.         xchg    si,di
  846.         inc    si
  847.         call    NamePut
  848.   NameSkipUpd:
  849.         push    cs
  850.         pop    es
  851.         pop    dx
  852.         mov    ah,9
  853.         int    21h
  854.  
  855.         or    Events,GOT_NSREPLY
  856.         mov    di,offset DefNsNum
  857.         call    ThisIpFirst        ; stick to this nameserver
  858.   NameRet:
  859.         ret
  860. DoName        endp
  861.  
  862.  
  863.  
  864. ;************************************************************************
  865. ;*        TabMarkGw
  866. ;************************************************************************
  867.  
  868. TabMarkGw    proc    near
  869.         mov    bx,TblSize
  870.         mov    ds,SegIpHwTbl
  871.   TabMarkLoop:
  872.         mov    si,bx
  873.         mov    dx,[si]
  874.         mov    ax,[si+2]
  875.         mov    cx,cs:DefGwyNum
  876.         mov    si,offset DefGwys
  877.         jcxz    TabGwyDone
  878.   TabGwyLoop:
  879.         cmp    ax,cs:[si+2]
  880.         jne    TabGwyNext
  881.         cmp    dx,cs:[si]
  882.         jne    TabGwyNext
  883.         mov    byte ptr [bx+13],'+'
  884.         jmp    short TabGwyDone
  885.   TabGwyNext:
  886.         add    si,4
  887.         loop    TabGwyLoop
  888.   TabGwyDone:
  889.         sub    bx,16
  890.         jns    TabMarkLoop
  891.  
  892.         mov    bx,cs:TblSize
  893.   TabDupLoop:
  894.         mov    si,bx
  895.   TabMarkHwLoop:
  896.         sub    si,16
  897.         js    TabDupNext
  898.  
  899.         mov    ax,[si+4+4]
  900.         cmp    ax,[bx+4+4]
  901.         jne    TabMarkHwLoop
  902.         mov    ax,[si+4+2]
  903.         cmp    ax,[bx+4+2]
  904.         jne    TabMarkHwLoop
  905.         mov    ax,[si+4]
  906.         cmp    ax,[bx+4]
  907.         jne    TabMarkHwLoop
  908.  
  909.         cmp    byte ptr [si+13],'+'
  910.         je    TabMarkHwDup
  911.  
  912.         mov    byte ptr [si+13],'>'
  913.         cmp    byte ptr [bx+13],'>'
  914.         je    TabMarkHwDup
  915.  
  916.         cmp    byte ptr [bx+13],'+'
  917.         je    TabMarkHwLoop
  918.  
  919.         mov    byte ptr [bx+13],'='
  920.         jmp    short TabMarkHwLoop
  921.  
  922.   TabMarkHwDup:
  923.         cmp    byte ptr [bx+13],'+'
  924.         je    TabMarkHwLoop
  925.  
  926.         mov    byte ptr [bx+13],'>'
  927.         jmp    short TabMarkHwLoop
  928.   TabDupNext:
  929.         sub    bx,16
  930.         jns    TabDupLoop
  931.  
  932.         push    cs
  933.         pop    ds
  934.         ret
  935. TabMarkGw    endp
  936.  
  937.  
  938. ;************************************************************************
  939. ;*        TabOpen
  940. ;************************************************************************
  941.  
  942. TabOpen     proc    near
  943.         mov    ax,3d02h
  944.         int    21h
  945.         mov    Handle,ax
  946.         jnc    TabOpenRet
  947.         mov    al,'B'-'0'
  948.         call    terminate
  949.   TabOpenRet:
  950.         ret
  951. TabOpen     endp
  952.  
  953.  
  954.  
  955. ;************************************************************************
  956. ;*        TabPutHw
  957. ;************************************************************************
  958.  
  959. TabPutHw    proc    near
  960.         mov    ds,cs:SegIpHwTbl
  961.         lea    si,[bx+4]
  962.         call    PutHwNum
  963.  
  964.         mov    ds,cs:SegIpHwTbl
  965.         cmp    byte ptr [bx+13],'>'
  966.         clc
  967.         jne    TabPutHwRet
  968.  
  969.         stc
  970.  
  971.   TabPutHwRet:
  972.         push    cs
  973.         pop    ds
  974.         ret
  975. TabPutHw    endp
  976.  
  977.  
  978.  
  979. ;************************************************************************
  980. ;*        TabPutName
  981. ;************************************************************************
  982.  
  983. TabPutName    proc    near
  984.         push    bx
  985.         mov    ds,cs:SegIpHwTbl
  986.         mov    bx,[bx+10]
  987.         mov    cx,8
  988.         mov    ds,cs:SegmNamTbl
  989.         mov    si,bx
  990.         mov    dl,[si]
  991.         rep    movsw
  992.         mov    cx,8
  993.         mov    ds,cs:SegmNamTbl2
  994.         mov    si,bx
  995.         rep    movsw
  996.         mov    ax,'# '
  997.         stosw
  998.  
  999.         pop    bx
  1000.         push    bx
  1001.         mov    ds,cs:SegIpHwTbl
  1002.         mov    si,bx
  1003.         mov    ah,[si+12]
  1004.         cmp    ah,' '
  1005.         je    TabPutNotActive
  1006. ;*test        inc    cs:TblActive
  1007.   TabPutNotActive:
  1008.         cmp    dl,'0'
  1009.         jb    TabPutKnown
  1010.         cmp    dl,'9'
  1011.         ja    TabPutKnown
  1012.         mov    al,'-'
  1013.   TabPutKnown:
  1014.         mov    dx,[si]
  1015.         mov    cx,[si+2]
  1016.         cmp    dx,[si+16]
  1017.         jne    TabPutNeN
  1018.         cmp    cx,[si+16+2]
  1019.         jne    TabPutNeN
  1020.         mov    al,'='
  1021.   TabPutNeN:
  1022.         cmp    dx,[si-16]
  1023.         jne    TabPutNeP
  1024.         cmp    cx,[si-16+2]
  1025.         jne    TabPutNeP
  1026.         mov    al,'<'
  1027.   TabPutNeP:
  1028.         stosw
  1029.         mov    al,[bx+13]
  1030.         stosb
  1031.         pop    bx
  1032.         ret
  1033. TabPutName    endp
  1034.  
  1035.  
  1036.  
  1037. ;************************************************************************
  1038. ;*        TabPutIp
  1039. ;************************************************************************
  1040.  
  1041. TabPutIp    proc    near
  1042.         mov    ds,cs:SegIpHwTbl
  1043.         mov    si,bx
  1044.         call    PutIpNum
  1045.         ret
  1046. TabPutIp    endp
  1047.  
  1048.  
  1049.  
  1050. ;************************************************************************
  1051. ;*        TabWrLine
  1052. ;************************************************************************
  1053.  
  1054. TabWrLine    proc    near
  1055.         push    bx
  1056.         mov    cx,di
  1057.         mov    dx,offset FileBuf
  1058.         sub    cx,dx
  1059.         mov    bx,Handle
  1060.         mov    ah,40h
  1061.         int    21h
  1062.         jnc    TabWrOK
  1063.   TabWrErr:
  1064.         mov    al,'W'-'0'
  1065.         call    terminate
  1066.   TabWrOK:
  1067.         pop    bx
  1068.         ret
  1069. TabWrLine    endp
  1070.  
  1071.  
  1072.  
  1073. ;************************************************************************
  1074. ;*        TabClose
  1075. ;************************************************************************
  1076.  
  1077. TabClose    proc    near
  1078.         mov    byte ptr FileBuf,'Z'-40h
  1079.         mov    dx,offset FileBuf
  1080.         mov    cx,1
  1081.         mov    bx,Handle
  1082.         mov    ah,40h
  1083.         int    21h
  1084.         jc    TabWrErr
  1085.  
  1086.         mov    bx,Handle
  1087.         mov    ah,3eh
  1088.         int    21h
  1089.         jnc    TabHwClOK
  1090.  
  1091.         mov    al,'C'-'0'
  1092.         call    terminate
  1093.   TabHwClOK:
  1094.         ret
  1095. TabClose    endp
  1096.  
  1097.  
  1098.  
  1099. ;************************************************************************
  1100. ;*        TableWr
  1101. ;************************************************************************
  1102.  
  1103. TableWr     proc    near
  1104.         cmp    TblSize,16
  1105.         ja    TableExist
  1106.         ret
  1107.  
  1108.   TableExist:
  1109.         push    bx
  1110.  
  1111.         call    TabMarkGw
  1112.  
  1113.         mov    dx,offset NameIpTbl
  1114.         call    TabOpen
  1115.         mov    bx,16
  1116.   TabIpNext:
  1117.         mov    di,offset FileBuf
  1118.  
  1119.         call    TabPutIp
  1120.  
  1121.         call    BlankUntil16
  1122.  
  1123.         call    TabPutName
  1124.  
  1125.         push    cs:ArgFlags
  1126.         and    cs:ArgFlags, not LANW_TABLE
  1127.         call    TabPutHw
  1128.         pop    ArgFlags
  1129.  
  1130.         mov    ax,CR+256*LF
  1131.         stosw
  1132.  
  1133.         call    TabWrLine
  1134.  
  1135.         add    bx,16
  1136.         cmp    bx,TblSize
  1137.         jb    TabIpNext
  1138.  
  1139.         call    TabClose
  1140.  
  1141.         mov    dx,offset NameHwTbl
  1142.         call    TabOpen
  1143.         mov    bx,16
  1144. ;*test        mov    TblActive,0
  1145.   TabHwNext:
  1146.         mov    di,offset FileBuf
  1147.         call    TabPutHw
  1148.         pushf
  1149.  
  1150.         mov    al,' '
  1151.         stosb
  1152.         call    TabPutName
  1153.  
  1154.         call    TabPutIp
  1155.  
  1156.         push    cs
  1157.         pop    ds
  1158.         mov    ax,CR+256*LF
  1159.         stosw
  1160.  
  1161.         popf
  1162. ;*test        jc    TabPutHwSkip
  1163.  
  1164.         call    TabWrLine
  1165.   TabPutHwSkip:
  1166.         add    bx,16
  1167.         cmp    bx,TblSize
  1168.         jb    TabHwNext
  1169.  
  1170.         call    TabClose
  1171.  
  1172.         pop    bx
  1173.  
  1174.         mov    di,offset MsgTblSize+6
  1175.         mov    ax,TblSize
  1176.         mov    cl,4
  1177.         shr    ax,cl
  1178.         dec    ax
  1179.         call    PutNum
  1180.         mov    di,offset MsgTblAct
  1181.         mov    ax,TblActive
  1182.         call    PutNum
  1183.         mov    dx,offset MsgTblSize
  1184.         mov    ah,9
  1185.         int    21h
  1186.  
  1187.         ret
  1188. TableWr     endp
  1189.  
  1190. ;========================================================================
  1191.  
  1192.